import random
from pypinyin import pinyin, Style
import tkinter as tk
from tkinter import scrolledtext, messagebox

# 读取成语大全数据库
def load_idioms(file_path):
    with open(file_path, 'r', encoding='utf-8') as file:
        idioms = file.readlines()
    return [idiom.strip() for idiom in idioms]

# 获取随机成语
def get_random_idiom(idioms):
    return random.choice(idioms)

# 判断成语是否在数据库中
def is_idiom_in_database(idiom, idioms):
    return idiom in idioms

# 获取机器接龙的成语
def get_machine_idiom(last_idiom, idioms):
    last_char_pinyin = pinyin(last_idiom[-1], style=Style.NORMAL)[0][0]
    available_idioms = [idiom for idiom in idioms if pinyin(idiom[0], style=Style.NORMAL)[0][0] == last_char_pinyin]

    if available_idioms:
        return random.choice(available_idioms)
    else:
        return None

# 获取提示
def get_hint(last_idiom, idioms):
    last_char_pinyin = pinyin(last_idiom[-1], style=Style.NORMAL)[0][0]
    hints = [idiom for idiom in idioms if pinyin(idiom[0], style=Style.NORMAL)[0][0] == last_char_pinyin]

    if hints:
        return random.choice(hints)
    else:
        return None

# 成语接龙游戏
def idiom_solitaire_game(root, idioms):
    def start_game():
        global current_idiom
        current_idiom = get_random_idiom(idioms)
        text.insert(tk.END, f"机器给出成语：{current_idiom}\n")
        text.insert(tk.END, "请输入接龙的成语（输入'提示'获取提示，输入'结束'结束游戏）：\n")
        text.see(tk.END)
        text.focus()

    def on_return(event):
        global current_idiom
        user_input = text.get("insert linestart", "insert lineend").strip()
        text.insert(tk.END, "\n")
        if user_input == "结束":
            text.insert(tk.END, "游戏结束！\n")
            start_game()
            return
        elif user_input == "提示":
            hint = get_hint(current_idiom, idioms)
            if hint:
                text.insert(tk.END, f"提示：{hint}\n")
            else:
                text.insert(tk.END, "没有更多提示了，请继续尝试。\n")
            text.insert(tk.END, "请输入接龙的成语（输入'提示'获取提示，输入'结束'结束游戏）：\n")
            text.see(tk.END)
            text.focus()
            return

        last_char_pinyin = pinyin(current_idiom[-1], style=Style.NORMAL)[0][0]
        user_first_char_pinyin = pinyin(user_input[0], style=Style.NORMAL)[0][0]
        if user_first_char_pinyin != last_char_pinyin:
            text.insert(tk.END, f"成语接龙错误，应以'{current_idiom[-1]}'的拼音开头，请重新输入。\n")
            text.insert(tk.END, "请输入接龙的成语（输入'提示'获取提示，输入'结束'结束游戏）：\n")
            text.see(tk.END)
            text.focus()
            return

        if not is_idiom_in_database(user_input, idioms):
            response = messagebox.askyesno("错误", "输入的成语不在数据库中。是否更换输入的成语？")
            if response:
                text.insert(tk.END, "请输入接龙的成语（输入'提示'获取提示，输入'结束'结束游戏）：\n")
                text.see(tk.END)
                text.focus()
                return
            else:
                current_idiom = user_input
                machine_idiom = get_machine_idiom(current_idiom, idioms)
                if machine_idiom:
                    text.insert(tk.END, f"用户给出成语：{user_input}\n")
                    text.insert(tk.END, f"机器接龙成语：{machine_idiom}\n")
                    current_idiom = machine_idiom
                else:
                    text.insert(tk.END, "机器无法在用户给出的成语后接龙，游戏结束！\n")
                    start_game()
                return

        text.insert(tk.END, f"用户给出成语：{user_input}\n")
        machine_idiom = get_machine_idiom(user_input, idioms)
        if machine_idiom:
            text.insert(tk.END, f"机器接龙成语：{machine_idiom}\n")
            current_idiom = machine_idiom
        else:
            text.insert(tk.END, "机器无法接龙，游戏结束！\n")
            start_game()
        text.insert(tk.END, "请输入接龙的成语（输入'提示'获取提示，输入'结束'结束游戏）：\n")
        text.see(tk.END)
        text.focus()

    root.title("成语接龙游戏")
    root.geometry("600x400")

    text = scrolledtext.ScrolledText(root, width=70, height=15, font=("Courier New", 12), wrap=tk.WORD)
    text.pack(pady=10, padx=10, fill=tk.BOTH, expand=True)
    text.bind("<Return>", on_return)

    # 设置文本框的初始内容
    text.insert(tk.END, "欢迎来到成语接龙游戏！\n")
    text.insert(tk.END, "请在下方输入框中输入成语，按回车键提交。\n")
    text.insert(tk.END, "输入'提示'获取提示，输入'结束'结束游戏。\n\n")

    start_game()

# 主函数
if __name__ == "__main__":
    file_path = 'E:/成语大全.txt'
    idioms = load_idioms(file_path)
    print(f"成语库中有 {len(idioms)} 个成语。")

    root = tk.Tk()
    idiom_solitaire_game(root, idioms)
    root.mainloop()